<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title></title>
</head>
<body>
	<script type="text/javascript">
		// 函数的提升:
			// js在预解析中:会将函数提升到作用域最上方,调用不会提升

		fn()
		var num = 10;
		function fn(){
			var num = 20;
			console.log(num)//20
		}
		//相当于=======函数的提升高于变量的提升,并且同名函数和变量,函数不会被变量的声明覆盖,但会被赋值覆盖
		// function fn(){
		// 	var num = 20;
		// 	console.log(num)//20
		// }
		// var num;
		// fn();
		// num = 10;

		// ======================
		// a()
		// var a = 1;
		// function a(){
		// 	console.log("马上放假")
		// }
		// console.log(a)
		// a()

		// 相当于
		// function a(){
		// 	console.log("马上放假")
		// }
		// var a;
		// a()
		// a = 1;
		// console.log(a)//1
		// a()//报错

		// ============================================
		// console.log(xy)
		// var xy;
		// function xy(){
		// 	console.log(z)
		// 	var z = "abc"
		// }
		// xy()

		// 相当于
		// function xy(){
		// 	var z
		// 	console.log(z)//undefined
		// 	z = "abc"
		// }
		// var xy;
		// console.log(xy)//f
		// xy()

		// ==============================
		// console.log(ab)
		// var ab = 10;
		// var z = 666;
		// function ab(){
		// 	console.log(z)
		// 	var z = "abc"
		// 	console.log(z)
		// }
		// ab()
		// console.log(ab)

		// 相当于
		// function ab(){
		// 	var z;
		// 	console.log(z)//undefined
		// 	z = "abc";
		// 	console.log(z)//abc
		// }
		// var ab;
		// var z;
		// console.log(ab)//f
		// ab = 10;
		// z = 666;
		// ab()//报错
		// console.log(ab)//10
		//============================

		// 函数表达式： 通过将匿名函数赋值给 变量，所以函数表达式 只能提示声明，不能提升函数，按照变量提升算
		let a = function(){

		}

		// ==========================================
		var getName = function(){
			console.log(1)
		}
		function getName() {
			console.log(2)
		}

		getName()//1

		// 相当于
		function getName(){
			console.log(2)
		}
		var getName;
		getName = function(){
			console.log(1)
		}
		getName()//1
	</script>
</body>
</html>